package cc.rengu.igas.bomp.core.service.trans;

import cc.rengu.igas.bomp.common.constant.BompAppParamConstant;
import cc.rengu.igas.bomp.common.constant.TableNameConstant;
import cc.rengu.igas.bomp.common.dao.*;
import cc.rengu.igas.bomp.common.dao.impl.*;
import cc.rengu.igas.bomp.common.entity.*;
import cc.rengu.igas.bomp.common.enums.QueryBizTypeEnum;
import cc.rengu.igas.bomp.common.enums.RespCodeEnum;
import cc.rengu.igas.bomp.common.util.InitParamUtil;
import cc.rengu.igas.bomp.core.service.base.ManageService;
import cc.rengu.igas.bomp.facade.bean.*;
import cc.rengu.igas.bomp.facade.request.MchntBaseInfoQueryRequest;
import cc.rengu.igas.bomp.facade.response.MchntBaseInfoQueryResponse;
import cc.rengu.igas.share.common.util.SensitiveDataUtil;
import cc.rengu.oltp.service.common.constant.AppParamConstant;
import cc.rengu.oltp.service.model.BizResponse;
import cc.rengu.oltp.utility.util.*;
import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 商户基本信息查询
 * Created by 王成 on 2020/3/10
 */
public class MchntBaseInfoQueryService extends ManageService {
    @Override
    protected Object bizBeforeCust() throws Exception {
        MchntBaseInfoQueryRequest mchntBaseInfoQueryRequest = new MchntBaseInfoQueryRequest();
        ConvertUtil.convertOutput(mchntBaseInfoQueryRequest);
        return mchntBaseInfoQueryRequest;
    }

    @Override
    protected BizResponse bizProcessCust(Object request) throws Exception {
        MchntBaseInfoQueryRequest mchntBaseInfoQueryRequest = (MchntBaseInfoQueryRequest) request;
        MchntBaseInfoQueryResponse mchntBaseInfoQueryResponse = new MchntBaseInfoQueryResponse();
        BizResponse<MchntBaseInfoQueryResponse> bizResponse = new BizResponse<>();
        bizResponse.setRspSysId(AppParamConstant.SYS_ID);
        MchntBaseInfo mchntBaseInfo = null;
        List<MchntApexInfo> mchntApexInfoList = new ArrayList<>();
        CupsMchntInfo cupsMchntInfo = null;
        WechatMchntInfo wechatMchntInfo = null;
        AlipayMchntInfo alipayMchntInfo = null;
        //获取用户角色信息
        XmlTreeUtil xmlTreeUtil = new XmlTreeUtil();
        String userRole = xmlTreeUtil.getXmlTreeStringValue("userRole");
        //获取参数信息
        String instId = mchntBaseInfoQueryRequest.getHeader().getInstId();
        String bizType = mchntBaseInfoQueryRequest.getHeader().getBizType();
        String mchntNo = mchntBaseInfoQueryRequest.getMchntNo();

        if (StringUtil.isEmptyOrNull(bizType)) {
            rglog.error("bizType<{}>为NULL!,无法查询信息", bizType);
            bizResponse.setRespCode(RespCodeEnum.PARAM_ERROR.getRespCode());
            bizResponse.setRespDesc(RespCodeEnum.PARAM_ERROR.getRespDesc());
            bizResponse.setResult(mchntBaseInfoQueryResponse);
            return bizResponse;
        }

        if (QueryBizTypeEnum.QUERY_TEMPORARY_TABLE.getType().equals(bizType)) {
            /* 查询临时基础信息表数据 */
            BizTmpMapper bizTmpMapper = new BizTmpMapperImpl();
            List<BizTmp> bizTmpList = bizTmpMapper.selectBizTmpByMchntNo(instId, mchntNo, TableNameConstant.T_B_MCHNT_BASE_INFO);
            if (null != bizTmpList && !bizTmpList.isEmpty()) {
                BizTmp bizTmp = bizTmpList.get(0);
                String mchntBaseInfoString = InitParamUtil.getJsonString(bizTmp);
                mchntBaseInfo = JSON.parseObject(mchntBaseInfoString, MchntBaseInfo.class);
            }

            /* 查询临时商户扩展属性表数据 */
            /* TODO POC演示 先查询正式商户扩展属性表，后续优化 */
            MchntApexInfoMapper mchntApexInfoMapper = new MchntApexInfoMapperImpl();
            mchntApexInfoList = mchntApexInfoMapper.selectMchntApexInfoByMchntNo(instId, mchntNo);
            if (null != mchntApexInfoList && !mchntApexInfoList.isEmpty()) {
                mchntApexInfoList = mchntApexInfoList.stream().filter(item -> DateUtil.compareDate(DateUtil.getCurrentDate(), item.getEffectiveDate()) >= 0).collect(Collectors.toList());
            }
            /*bizTmpList = bizTmpMapper.selectBizTmpByMchntNo(instId, mchntNo, TableNameConstant.T_B_MCHNT_APEX_INFO);
            if (null != bizTmpList && !bizTmpList.isEmpty()) {
                for (BizTmp bizTmp : bizTmpList) {
                    String mchntApexInfoString = InitParamUtil.getJsonString(bizTmp);
                    MchntApexInfo mchntApexInfo = JSON.parseObject(mchntApexInfoString, MchntApexInfo.class);
                    if (DateUtil.compareDate(DateUtil.getCurrentDate(), mchntApexInfo.getEffectiveDate()) >= 0) {
                        mchntApexInfoList.add(mchntApexInfo);
                    }
                }
            }*/

            /* 查询临时银联商户信息表数据 */
            bizTmpList = bizTmpMapper.selectBizTmpByMchntNo(instId, mchntNo, TableNameConstant.T_B_CUPS_MCHNT_INFO);
            if (null != bizTmpList && !bizTmpList.isEmpty()) {
                BizTmp bizTmp = bizTmpList.get(0);
                String cupsMchntInfoString = InitParamUtil.getJsonString(bizTmp);
                cupsMchntInfo = JSON.parseObject(cupsMchntInfoString, CupsMchntInfo.class);
            }

            /* 查询临时微信商户信息表数据 */
            bizTmpList = bizTmpMapper.selectBizTmpByMchntNo(instId, mchntNo, TableNameConstant.T_B_WECHAT_MCHNT_INFO);
            if (null != bizTmpList && !bizTmpList.isEmpty()) {
                BizTmp bizTmp = bizTmpList.get(0);
                String wechatMchntInfoString = InitParamUtil.getJsonString(bizTmp);
                wechatMchntInfo = JSON.parseObject(wechatMchntInfoString, WechatMchntInfo.class);
            }

            /* 查询临时支付宝商户信息表数据 */
            bizTmpList = bizTmpMapper.selectBizTmpByMchntNo(instId, mchntNo, TableNameConstant.T_B_ALPAY_MCHNT_INFO);
            if (null != bizTmpList && !bizTmpList.isEmpty()) {
                BizTmp bizTmp = bizTmpList.get(0);
                String alipayMchntInfoString = InitParamUtil.getJsonString(bizTmp);
                alipayMchntInfo = JSON.parseObject(alipayMchntInfoString, AlipayMchntInfo.class);
            }
        } else {
            /* 查询正式基础信息表数据 */
            MchntBaseInfoMapper mchntBaseInfoMapper = new MchntBaseInfoMapperImpl();
            mchntBaseInfo = mchntBaseInfoMapper.selectMchntBaseInfoByPrimaryKey(instId, mchntNo);
            if (null == mchntBaseInfo) {
                rglog.error("根据条件查询商户基本信息查询服务为空!");
                bizResponse.setRespCode(RespCodeEnum.QUERY_DATA_IS_NULL.getRespCode());
                bizResponse.setRespDesc(RespCodeEnum.QUERY_DATA_IS_NULL.getRespDesc());
                bizResponse.setResult(mchntBaseInfoQueryResponse);
                return bizResponse;
            }

            /* 查询正式商户扩展属性表 */
            MchntApexInfoMapper mchntApexInfoMapper = new MchntApexInfoMapperImpl();
            mchntApexInfoList = mchntApexInfoMapper.selectMchntApexInfoByMchntNo(instId, mchntNo);
            if (null != mchntApexInfoList && !mchntApexInfoList.isEmpty()) {
                mchntApexInfoList = mchntApexInfoList.stream().filter(item -> DateUtil.compareDate(DateUtil.getCurrentDate(), item.getEffectiveDate()) >= 0).collect(Collectors.toList());
            }

            /* 查询正式银联商户信息数据 */
            CupsMchntInfoMapper cupsMchntInfoMapper = new CupsMchntInfoMapperImpl();
            cupsMchntInfo = cupsMchntInfoMapper.selectCupsMchntInfoByPrimaryKey(instId, mchntNo);
            if (null == cupsMchntInfo) {
                rglog.warn("根据条件查询银联商户信息查询服务为空!");
            }

            /* 查询正式微信商户信息数据 */
            WechatMchntInfoMapper wechatMchntInfoMapper = new WechatMchntInfoMapperImpl();
            wechatMchntInfo = wechatMchntInfoMapper.selectWechatMchntInfoByPrimaryKey(instId, mchntNo);
            if (null == wechatMchntInfo) {
                rglog.warn("根据条件查询微信商户信息查询服务为空!");
            }

            /* 查询正式支付宝信息表数据 */
            AlipayMchntInfoMapper alipayMchntInfoMapper = new AlipayMchntInfoMapperImpl();
            alipayMchntInfo = alipayMchntInfoMapper.selectAlipayMchntInfoByPrimaryKey(instId, mchntNo);
            if (null == alipayMchntInfo) {
                rglog.warn("根据条件查询支付宝商户信息查询服务为空!");
            }
        }

        MchntBaseInfoBean mchntBaseInfoBean = new MchntBaseInfoBean();
        MchntContactsInfoBean mchntContactsInfoBean = new MchntContactsInfoBean();
        CupsMchntInfoBean cupsMchntInfoBean = new CupsMchntInfoBean();
        WechatMchntInfoBean wechatMchntInfoBean = new WechatMchntInfoBean();
        AlipayMchntInfoBean alipayMchntInfoBean = new AlipayMchntInfoBean();
        /* 将商户基本信息表中的数据转换成接口响应数据 */
        if (null != mchntBaseInfo) {
            /* 判断商户是否为黑名单商户 */
            BompMchntBlackListMapper bompMchntBlackListMapper = new BompMchntBlackListMapperImpl();
            List<MchntBlackListInfo> mchntBlackListInfoList = bompMchntBlackListMapper.selectBompMchntBlackListInfoByInstIdMchntNo(instId, mchntNo);
            if (null != mchntBlackListInfoList && !mchntBlackListInfoList.isEmpty()) {
                Optional<MchntBlackListInfo> mchntBlackListInfoOpt = mchntBlackListInfoList.stream().filter(item -> item.getValidStatus().equals("01")).findFirst();
                if (mchntBlackListInfoOpt.isPresent()) {
                    String currentDate = DateUtil.getCurrentDate();
                    String validDate = DateUtil.dateStringFormatConvert(mchntBlackListInfoOpt.get().getValidDate(),"yyyy-MM-dd","yyyyMMdd");
                    if (DateUtil.compareDate(currentDate,validDate) <= 0) {
                        rglog.error("当前商户<{}>为黑名单商户!", mchntNo);
                        bizResponse.setRespCode(RespCodeEnum.BLACK_MCHNT_NO.getRespCode());
                        bizResponse.setRespDesc(RespCodeEnum.BLACK_MCHNT_NO.getRespDesc());
                        bizResponse.setResult(mchntBaseInfoQueryResponse);
                        return bizResponse;
                    }
                }
            }
            BeanUtil.beanCopy(mchntBaseInfo, mchntBaseInfoQueryResponse);
            BeanUtil.beanCopy(mchntBaseInfo, mchntBaseInfoBean);
            BeanUtil.beanCopy(mchntBaseInfo, mchntContactsInfoBean);

            if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getMchntLevel())) {
                MchntLevelInfoMapper mchntLevelInfoMapper = new MchntLevelInfoMapperImpl();
                MchntLevelInfo mchntLevelInfo = mchntLevelInfoMapper.selectMchntLevelInfoByMchntLevelCode(mchntBaseInfo.getInstId(), mchntBaseInfo.getMchntLevel());
                if (null != mchntLevelInfo) {
                    mchntBaseInfoBean.setMchntLevelName(mchntLevelInfo.getMchntLevelName());
                }
            }

            OrganizationMapper organizationMapper = new OrganizationMapperImpl();
            /*签约机构名称查询*/
            Organization signOrg = organizationMapper.selectOrganizationByPrimaryKey(mchntBaseInfo.getInstId(), mchntBaseInfo.getSignInstId());
            if (null != signOrg) {
                mchntBaseInfoBean.setSignInstName(signOrg.getOrgName());
            }

            /* 获取行政区域位置信息 */
            RegionInfoMapper regionInfoMapper = new RegionInfoMapperImpl();
            if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getMchntBizProvince())) {
                RegionInfo regionInfo = regionInfoMapper.selectRegionInfoByPrimaryKey(mchntBaseInfo.getMchntBizProvince());
                if (null != regionInfo) {
                    mchntBaseInfoBean.setMchntBizProvinceName(regionInfo.getRegionName());
                }

                regionInfo = regionInfoMapper.selectRegionInfoByPrimaryKey(mchntBaseInfo.getMchntBizCity());
                if (null != regionInfo) {
                    mchntBaseInfoBean.setMchntBizCityName(regionInfo.getRegionName());
                }

                regionInfo = regionInfoMapper.selectRegionInfoByPrimaryKey(mchntBaseInfo.getMchntBizRegion());
                if (null != regionInfo) {
                    mchntBaseInfoBean.setMchntBizRegionName(regionInfo.getRegionName());
                }
            }

            if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getAgentMchntNo())) {
                AgentInfoMapper agentInfoMapper = new AgentInfoMapperImpl();
                AgentInfo agentInfo = agentInfoMapper.selectAgentInfoByPrimaryKey(instId, mchntBaseInfo.getAgentMchntNo());
                if (null != agentInfo) {
                    mchntBaseInfoBean.setAgentName(agentInfo.getAgentName());
                }
            }
            if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getPlatMchntNo())) {
                PlatMchntInfoMapper platMchntInfoMapper = new PlatMchntInfoMapperImpl();
                PlatMchntInfo platMchntInfo = platMchntInfoMapper.selectPlatMchntInfoByMchntNo(instId, mchntBaseInfo.getPlatMchntNo());
                if (null != platMchntInfo) {
                    mchntBaseInfoBean.setPlatMchntName(platMchntInfo.getPlatMchntName());
                }
            }
            if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getGroupMchntNo())) {
                GroupMchntInfoMapper groupMchntInfoMapper = new GroupMchntInfoMapperImpl();
                GroupMchntInfo groupMchntInfo = groupMchntInfoMapper.selectGroupMchntInfoByPrimaryKey(instId, mchntBaseInfo.getGroupMchntNo());
                if (null != groupMchntInfo) {
                    mchntBaseInfoBean.setGroupMchntName(groupMchntInfo.getGroupMchntName());
                }
            }

            if (!StringUtil.isEmptyOrNull(userRole) && BompAppParamConstant.MCHNT_ROLES.contains(userRole)) {
                //商户角色，敏感数据脱敏
                /*
                 *  1 - 手机号，脱敏规则：前3后4，中间全部用*代替
                 *  2 - 银行账号，脱敏规则：前6后4，中间全部用*代替
                 *  3 - 证件信息，脱敏规则：前6后4，中间全部用*代替
                 *  4 - 姓名，脱敏规则：前1后1，中间全部用*代替
                 */
                rglog.info("商户角色，敏感信息脱敏");
                if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getMchntContactName())) {
                    String contactName = SensitiveDataUtil.desensitization("4", mchntBaseInfo.getMchntContactName());
                    rglog.info("contactName:" + contactName);
                    mchntContactsInfoBean.setContactName(contactName.split("\\|")[0]);
                }
                if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getMchntContactCertNo())) {
                    String contactCertNo = SensitiveDataUtil.desensitization("3", mchntBaseInfo.getMchntContactCertNo());
                    rglog.info("contactCertNo:" + contactCertNo);
                    mchntContactsInfoBean.setContactCertNo(contactCertNo.split("\\|")[0]);
                }
                if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getMchntContactPhone())) {
                    String mchntContactPhone = SensitiveDataUtil.desensitization("1", mchntBaseInfo.getMchntContactPhone());
                    rglog.info("mchntContactPhone:" + mchntContactPhone);
                    mchntContactsInfoBean.setContactPhone(mchntContactPhone.split("\\|")[0]);
                }
                if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getMchntContactMobile())) {
                    String contactMobile = SensitiveDataUtil.desensitization("1", mchntBaseInfo.getMchntContactMobile());
                    mchntContactsInfoBean.setContactMobile(contactMobile.split("\\|")[0]);
                }
                if (!StringUtil.isEmptyOrNull(mchntBaseInfo.getMchntContactEmail())) {
                    String contactEmail = SensitiveDataUtil.desensitization("5", mchntBaseInfo.getMchntContactEmail()).split("\\|")[0];
                    mchntContactsInfoBean.setContactEmail(contactEmail);
                }
            } else {
                mchntContactsInfoBean.setContactName(mchntBaseInfo.getMchntContactName());
                mchntContactsInfoBean.setContactCertNo(mchntBaseInfo.getMchntContactCertNo());
                mchntContactsInfoBean.setContactPhone(mchntBaseInfo.getMchntContactPhone());
                mchntContactsInfoBean.setContactMobile(mchntBaseInfo.getMchntContactMobile());
                mchntContactsInfoBean.setContactEmail(mchntBaseInfo.getMchntContactEmail());
            }
            mchntBaseInfoBean.setMchntNo(mchntBaseInfo.getMchntNo());
            mchntBaseInfoBean.setCashWithdrawalFlag(mchntBaseInfo.getCashWithdrawalFlag());
            mchntBaseInfoBean.setManagementScope(mchntBaseInfo.getManagementScope());
            mchntBaseInfoBean.setIndustryType(mchntBaseInfo.getIndustryType());
            mchntContactsInfoBean.setContactCertType(mchntBaseInfo.getMchntContactCertType());
        } else {
            rglog.error("根据条件查询商户基本信息查询服务为空!");
            bizResponse.setRespCode(RespCodeEnum.QUERY_DATA_IS_NULL.getRespCode());
            bizResponse.setRespDesc(RespCodeEnum.QUERY_DATA_IS_NULL.getRespDesc());
            bizResponse.setResult(mchntBaseInfoQueryResponse);
            return bizResponse;
        }

        if (null != mchntApexInfoList && !mchntApexInfoList.isEmpty()) {
            List<MchntApexInfoBean> mchntApexInfoBeanList = new ArrayList<>();
            for (MchntApexInfo mchntApexInfo : mchntApexInfoList) {
                MchntApexInfoBean mchntApexInfoBean = new MchntApexInfoBean();
                BeanUtil.beanCopy(mchntApexInfo, mchntApexInfoBean);
                mchntApexInfoBeanList.add(mchntApexInfoBean);
            }
            mchntBaseInfoQueryResponse.setMchntApexInfoList(mchntApexInfoBeanList);
        }

        if (null != cupsMchntInfo) {
            BeanUtil.beanCopy(cupsMchntInfo, cupsMchntInfoBean);
        }

        if (null != wechatMchntInfo) {
            BeanUtil.beanCopy(wechatMchntInfo, wechatMchntInfoBean);
        }

        if (null != alipayMchntInfo) {
            BeanUtil.beanCopy(alipayMchntInfo, alipayMchntInfoBean);
        }

        mchntBaseInfoQueryResponse.setMchntBaseInfo(mchntBaseInfoBean);
        mchntBaseInfoQueryResponse.setMchntContactsInfo(mchntContactsInfoBean);
        mchntBaseInfoQueryResponse.setCupsMchntInfo(cupsMchntInfoBean);
        mchntBaseInfoQueryResponse.setWechatMchntInfo(wechatMchntInfoBean);
        mchntBaseInfoQueryResponse.setAlipayMchntInfo(alipayMchntInfoBean);
        /* 按照接口转换基础产品信息并响应给请求方 */
        bizResponse.setRespCode(RespCodeEnum.TRANS_SUCCESS.getRespCode());
        bizResponse.setRespDesc(RespCodeEnum.TRANS_SUCCESS.getRespDesc());
        bizResponse.setResult(mchntBaseInfoQueryResponse);
        return bizResponse;
    }

    @Override
    protected void bizAfterCust(Object response) throws Exception {
        BizResponse bizResponse = (BizResponse) response;
        MchntBaseInfoQueryResponse mchntBaseInfoQueryResponse = (MchntBaseInfoQueryResponse) bizResponse.getResult();
        ConvertUtil.convertInput(mchntBaseInfoQueryResponse);
    }
}
